package com.ruoyi.tzai.mapper;

import java.util.List;
import com.ruoyi.tzai.domain.ApiKeyPool;
import org.apache.ibatis.annotations.Param;

/**
 * API Key池Mapper接口
 * 
 * @author tzai
 * @date 2025-11-12
 */
public interface ApiKeyPoolMapper 
{
    /**
     * 查询API Key池
     * 
     * @param keyId API Key池主键
     * @return API Key池
     */
    public ApiKeyPool selectApiKeyPoolByKeyId(Long keyId);

    /**
     * 查询API Key池列表
     * 
     * @param apiKeyPool API Key池
     * @return API Key池集合
     */
    public List<ApiKeyPool> selectApiKeyPoolList(ApiKeyPool apiKeyPool);

    /**
     * 查询可用的Key(按优先级和负载排序)
     * 
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param limit 限制数量
     * @return API Key池集合
     */
    public List<ApiKeyPool> selectAvailableKeys(@Param("resourceType") String resourceType,
                                                 @Param("resourceId") Long resourceId,
                                                 @Param("limit") int limit);

    /**
     * 查询跨资源的可用Key(用于AI跨模型)
     * 
     * @param resourceType 资源类型
     * @param resourceIds 资源ID列表
     * @param limit 限制数量
     * @return API Key池集合
     */
    public List<ApiKeyPool> selectAvailableKeysAcrossResources(@Param("resourceType") String resourceType,
                                                                @Param("resourceIds") List<Long> resourceIds,
                                                                @Param("limit") int limit);

    /**
     * 新增API Key池
     * 
     * @param apiKeyPool API Key池
     * @return 结果
     */
    public int insertApiKeyPool(ApiKeyPool apiKeyPool);

    /**
     * 修改API Key池
     * 
     * @param apiKeyPool API Key池
     * @return 结果
     */
    public int updateApiKeyPool(ApiKeyPool apiKeyPool);

    /**
     * 删除API Key池
     * 
     * @param keyId API Key池主键
     * @return 结果
     */
    public int deleteApiKeyPoolByKeyId(Long keyId);

    /**
     * 批量删除API Key池
     * 
     * @param keyIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteApiKeyPoolByKeyIds(Long[] keyIds);

    /**
     * 增加Key的当前使用数(原子操作)
     * 
     * @param keyId Key ID
     * @return 结果
     */
    public int incrementKeyUsage(@Param("keyId") Long keyId);

    /**
     * 减少Key的当前使用数(原子操作)
     * 
     * @param keyId Key ID
     * @return 结果
     */
    public int decrementKeyUsage(@Param("keyId") Long keyId);

    /**
     * 更新Key统计信息
     * 
     * @param keyId Key ID
     * @param success 是否成功
     * @param responseTime 响应时间(毫秒)
     * @return 结果
     */
    public int updateKeyStats(@Param("keyId") Long keyId,
                              @Param("success") boolean success,
                              @Param("responseTime") Long responseTime);

    /**
     * 标记Key为限流状态
     * 
     * @param keyId Key ID
     * @param seconds 限流秒数
     * @return 结果
     */
    public int markKeyRateLimited(@Param("keyId") Long keyId,
                                  @Param("seconds") int seconds);

    /**
     * 恢复限流状态的Key
     * 
     * @return 结果
     */
    public int recoverRateLimitedKeys();
}

